/*
 * EnumsAndTads.h
 *
 *  Created on: 01/10/2011
 *      Author: utn_so
 */

#ifndef ENUMSANDTADS_H_
#define ENUMSANDTADS_H_

//ESTRUCTURA DE LOS PEDIDOS QUE PUEDEN VENIR DE LA CONSOLA

typedef struct info{
	char *respuesta;
}__attribute__ ((__packed__))pedido_info;

typedef struct clean{
	int32_t sectorInicial;
	int32_t sectorFinal;
}__attribute__ ((__packed__))pedido_clean;

typedef struct trace1{
	int32_t s1;
}__attribute__ ((__packed__))pedido_t1;

typedef struct trace2{
	int32_t s1;
	int32_t s2;
}__attribute__ ((__packed__))pedido_t2;

typedef struct trace3{
	int32_t s1;
	int32_t s2;
	int32_t s3;
}__attribute__ ((__packed__))pedido_t3;

typedef struct trace4{
	int32_t s1;
	int32_t s2;
	int32_t s3;
	int32_t s4;
}__attribute__ ((__packed__))pedido_t4;

typedef struct trace5{
	int32_t s1;
	int32_t s2;
	int32_t s3;
	int32_t s4;
	int32_t s5;
}__attribute__ ((__packed__))pedido_t5;

//CABECERA DEL PAQUETE DEL PROTOCOLO NIPC

typedef struct cabeceraPaquete{
	int32_t type;
	int32_t payloadlength;
}__attribute__ ((__packed__)) cabecera_paquete;

//ESTRUCTURA DE LAS RESPUESTAS DEL TRACE

typedef struct respuesta_trace
{
	int32_t posicionActual;
	int32_t sectorSolicitado;
	float tiempoConsumido;
	int32_t proximoSector;
}__attribute__ ((__packed__)) respuesta_trace;

typedef struct protocoloINFO_respuesta
{
	cabecera_paquete cabecera;
	int32_t posicionActual;
}__attribute__ ((__packed__))protocoloINFO_respuesta;

typedef struct protocoloCLEAN_respuesta
{
	cabecera_paquete cabecera;
	int32_t respuestaClean;
}__attribute__ ((__packed__))protocoloCLEAN_respuesta;

typedef struct protocoloTRACE_respuesta
{
	cabecera_paquete cabecera;
	respuesta_trace payload;
	int32_t *sectoresRecorridos;
}__attribute__ ((__packed__))protocoloTRACE_respuesta;

//ESTRUCTURA DEL FLUJO DE DATOS QUE SE ENVIA POR SOCKET

typedef struct t_stream
{
	int32_t length;
	char *data;
}__attribute__ ((__packed__))t_stream;



typedef struct{
	char bufferSector[BLOQUE_512];
}__attribute__ ((__packed__)) PPD_SECTOR_DEVUELVE;

typedef struct{
	int32_t cylinder;
	int32_t head;
	int32_t sector;
}__attribute__ ((__packed__)) PPD_CHS;

typedef struct t_pedido {
	char lectura_o_escritura; //l=lectura, e=escritura
	int32_t direccionSector;
	char planificador_id[25];
	int32_t conexion_ppd_id;
	int32_t conexion_pfs_id;
	char info[512];
}__attribute__ ((__packed__)) t_pedido;

typedef struct t_pedido_consola {
	int32_t posicionActual;
	int32_t sectorSolicitado;
	int32_t sectoresRecorridos;
	int32_t tiempoConsumido;
	int32_t proximoSector;
	int32_t conexion_ppd_id;
	char info[512];
}__attribute__ ((__packed__)) t_pedido_consola;

struct Nodo{
	t_pedido structPedidos;
	struct Nodo *sig;
} typedef Nodo;

struct NodoNstep{
	Nodo *pedidos;
	int32_t cantidadPedidos;
	struct NodoNstep *sig;
} typedef NodoNstep;

typedef struct NodoCola{
	t_pedido pedido;
	struct NodoCola *siguiente;
}t_nodoCola;

typedef struct ColaPedidos{
	t_nodoCola *frente;
	t_nodoCola *fin;
	sem_t cantidadPedidos;
}t_Cola;

struct NodoPFS{
	int32_t cliente_pfs;
	int32_t cantidadClientes;
	struct NodoPFS *sig;
} typedef NodoPFS;

typedef struct protocoloNIPC_Head{
	char type;
	int32_t payloadlength;
}__attribute__ ((__packed__)) nipcHead;

//typedef struct protocoloNIPC_Payload{
//		t_pedido payload;
//}__attribute__ ((__packed__)) nipcPayload;

typedef struct protocoloNIPC{
	int32_t type;
	int32_t payloadlength;
	t_pedido payload;
}__attribute__ ((__packed__)) nipc;

typedef struct protocoloNIPCConsola{
	nipcHead cabecera;
	t_pedido_consola payload;
}__attribute__ ((__packed__)) nipcConsola;

typedef struct{
	Nodo **lista;
	//NodoNstep **listaNstep;
	int32_t socket_id;
}__attribute__ ((__packed__)) struct_thread_lector;

typedef struct config{
	char ModoInicio[50];
	char AlgoritmoPlanificacion[50];
	char PathArchivo[150];
	char PathLog[150];
	int32_t PuertoEscuchaPpd;
	char IPRaid[16];
	int32_t PuertoRaid;
	int32_t LogActivado;
	char DiscoID[100];
	int32_t Cylinders;
	int32_t Heads;
	int32_t Sectors;
	int32_t tamanioListaScan;
	int32_t RPM;
	int32_t TiempoLectura;
	int32_t TiempoEscritura;
	int32_t TiempoEntrePistas;
	int32_t tiempoRetardoEscritura;
	int32_t cantClientesMaxPFS;
	char PathConsola[150];
	char SocketUNIX[20];
}__attribute__ ((__packed__)) struct_config;

//TIPOS DE PEDIDOS CAPACES DE ENVIAR Y RECIBIR

enum NIPC_TYPE {HANDSHAKE=0,
	LECTURA=1,
	LECTURA_OK = 11,
	ESCRITURA=2,
	ESCRITURA_OK=21,
	LECTURA_ERROR=10,
	ESCRITURA_ERROR=20,
	INFOCONSOLA=3,
	CLEAN=4,
	TRACE1=51,
	TRACE2=52,
	TRACE3=53,
	TRACE4=54,
	TRACE5=55,
	SIZEPEDIDOS=56,
	TEMPO=57
};

enum MODO_INICIO_TYPE
{
	CONNECT = 100,
	LISTEN = 200
};

enum PEDIDO_TYPE
{
	PEDIDO_CONSOLA = -2
};

enum ALGORITMO_TYPE{
	CON_INANICION = 300,
	SIN_INANICION = 400
};

//esto despues hay que sacarlo

//ESTRUCTURA DE LOS PROTOCOLOS NIPC DE PEDIDOS DE INFO, CLEAN, TRACE1, TRACE2, TRACE3, TRACE4 Y TRACE5

typedef struct protocoloINFO
{
	cabecera_paquete cabecera;
	pedido_info payload;
}protocoloINFO;

typedef struct protocoloCLEAN
{
	cabecera_paquete cabecera;
	pedido_clean payload;
}protocoloCLEAN;

typedef struct protocoloTRACE1
{
	cabecera_paquete cabecera;
	pedido_t1 payload;
}protocoloTRACE1;

typedef struct protocoloTRACE2
{
	cabecera_paquete cabecera;
	pedido_t2 payload;
}protocoloTRACE2;

typedef struct protocoloTRACE3
{
	cabecera_paquete cabecera;
	pedido_t3 payload;
}protocoloTRACE3;

typedef struct protocoloTRACE4
{
	cabecera_paquete cabecera;
	pedido_t4 payload;
}protocoloTRACE4;

typedef struct protocoloTRACE5
{
	cabecera_paquete cabecera;
	pedido_t5 payload;
}protocoloTRACE5;

#endif /* ENUMSANDTADS_H_ */
